package cn.pm.datasource.sharding.converter;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.AbstractDateDeserializer;
import lombok.extern.slf4j.Slf4j;
import org.junit.platform.commons.util.StringUtils;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.Map;

/**
 * Create by spf on 2019/06/14
 * 适用于fastJson的日期字段转换器
 *
 * 某些时候，我们期望一个Bean的字段 在向客户端序列化的时候 格式为 yyyy-MM-dd,但是在提交参数时，又需要此字段精确到 yyyy-MM-dd HH:mm:ss
 * 此时可在字段上加入注解：
 *     @JSONField(format = "yyyy-MM-dd", deserializeUsing = DateConverter4Json.class)
 *     private Date startDate;
 * 其中 format          : 表示序列化的格式
 *     deserializeUsing : 表示@RequestBody反序列化时，此字段使用指定的Date解析器
 */
@Slf4j
public class DateConverter4Json extends AbstractDateDeserializer {


    private DateConverter dateConverter = new DateConverter();

    /**
     * 根据json对象，转换指定字段为Date对象
     */
    @Override
    protected <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value) {
        //此处得到是前端传来的所有数据的原始格式字符串
        Object object = parser.input;
        //将json字符串转为map，方便后续操作
        Map map = JSON.parseObject(String.valueOf(object),Map.class);
        //获取对应参数值（ps:不明白参数类型为什么是Object）
        String strVal =(String) map.get(String.valueOf(fieldName));
        //格式化成日期
        Date date = dateConverter.convert(strVal);
        if (StringUtils.isNotBlank(strVal) && date == null) {
            log.error("日期参数转换失败 FieldName:{} \tValue:{}", fieldName, strVal);
            //throw new BaseException(CommonResultCode.ILLEGAL_PARAM);
        }
        return (T) date;
    }


    @Override
    public int getFastMatchToken() {
        return 0;
    }
}

